import { Event } from '../../utils';

import { ITerminalExitEvent, ITerminalTitleChangeEvent } from './client';
import { ITerminalExternalClient } from './controller';
import { ITerminalInfo, TerminalOptions } from './pty';

// 终端 API 服务接口，提供终端的创建、操作、事件等能力
export interface ITerminalApiService {
  /**
   * 创建一个新的终端
   * @param options 终端启动参数
   * @param id 可选，指定终端 id
   */
  createTerminal(
    options: TerminalOptions,
    id?: string
  ): Promise<ITerminalExternalClient>;

  /**
   * 向指定终端发送文本
   * @param id 终端 id
   * @param text 发送内容
   * @param addNewLine 是否自动添加换行
   */
  sendText(id: string, text: string, addNewLine?: boolean): void;

  /**
   * 获取指定终端的进程 id
   * @param sessionId 终端会话 id
   */
  getProcessId(sessionId: string): Promise<number | undefined>;

  /**
   * 终端打开事件
   */
  onDidOpenTerminal: Event<ITerminalInfo>;

  /**
   * 终端关闭事件
   */
  onDidCloseTerminal: Event<ITerminalExitEvent>;

  /**
   * 终端标题变更事件
   */
  onDidTerminalTitleChange: Event<ITerminalTitleChangeEvent>;

  /**
   * 活跃终端变更事件
   */
  onDidChangeActiveTerminal: Event<string>;

  /**
   * 当前所有终端信息
   */
  terminals: ITerminalInfo[];

  /**
   * 显示指定终端
   * @param id 终端 id
   * @param preserveFocus 是否保留焦点
   */
  showTerm(id: string, preserveFocus?: boolean): void;

  /**
   * 隐藏指定终端
   * @param id 终端 id
   */
  hideTerm(id: string): void;

  /**
   * 移除指定终端
   * @param id 终端 id
   */
  removeTerm(id: string): void;

}
